# encoding: utf-8
module TransferenciaService
	include TipoTransacao

	#
	#
	def efetivar_transferencia(transf, usuario)
		# valida dados da transferencia
		return transf unless transf.valid?

		# valida contas
		begin
			origem = Conta.find(transf.origem)
			destino = Conta.find(transf.destino)
			
			unless (origem.usuario == usuario)
				transf.errors.add(:origem, "inválida")
			end

			unless (destino.usuario == usuario)
				transf.errors.add(:destino, "inválida")
			end
		rescue
			transf.errors.add(:origem, "inválida") if origem.nil?
			transf.errors.add(:destino, "inválida") if destino.nil?
		end

		return transf if transf.errors.any?
		
		ActiveRecord::Base.transaction do
			begin
				debito = Debito.create(:valor => transf.valor, :data => transf.data,
					:conta_id => transf.origem,
					:observacao => transf.observacao)

				credito = Credito.create(:valor => transf.valor, :data => transf.data,
					:conta_id => transf.destino,
					:transacao_relacionada => debito,
					:observacao => transf.observacao)

				debito.update_attributes(:transacao_relacionada => credito)
			rescue ActiveRecord::Rollback => e
				transf.errors.add(:base, e.message)
				return transf
			rescue ArgumentError => e
				transf.errors.add(:base, e.message)
				return transf
			end
		end
		
		return transf
	end
end
